import requestCache from './RequestCache';
import { CacheOptions } from './RequestCache';

export interface OriginRequestOptions extends CacheOptions {
  /**
   * 请求的唯一键，用于标识相同请求
   * 如果不提供，将使用请求函数本身或函数签名作为键
   */
  key?: string | number | symbol;
}

/**
 * 归源请求函数，确保同一时间内相同的请求只执行一次
 * @param requestFn 请求函数
 * @param options 请求配置选项
 * @returns 请求函数的执行结果
 */
export async function originRequest<T>(
  requestFn: () => Promise<T>, 
  options?: OriginRequestOptions
): Promise<T> {
  const { key, ...cacheOptions } = options || {};
  
  // 确定缓存键
  let cacheKey: string | number | symbol;
  
  if (key !== undefined) {
    // 使用提供的键
    cacheKey = key;
  } else if (requestFn.name) {
    // 使用具名函数的引用
    cacheKey = Symbol.for(requestFn.name);
  } else {
    // 匿名函数使用函数签名
    cacheKey = requestFn.toString();
  }

  // 检查缓存中是否存在
  let cachedResult = requestCache.get<T>(cacheKey);
  
  // 如果缓存不存在，执行请求并缓存结果
  if (!cachedResult) {
    const resultPromise = requestFn();
    requestCache.set(cacheKey, resultPromise, cacheOptions);
    cachedResult = resultPromise;
  }

  return cachedResult;
}

/**
 * 设置全局默认缓存有效期
 * @param expireTime 缓存有效期（毫秒），null表示永不过期
 */
export function setDefaultCacheExpireTime(expireTime: number | null): void {
  requestCache.setDefaultExpireTime(expireTime);
}

/**
 * 清除特定请求的缓存
 * @param key 请求的唯一键
 */
export function clearRequestCache(key: string | number | symbol): boolean {
  return requestCache.delete(key);
}

/**
 * 清除所有请求缓存
 */
export function clearAllRequestCache(): void {
  requestCache.clear();
}

export default {
  convert: originRequest,
  setDefaultCacheExpireTime,
  clearRequestCache,
  clearAllRequestCache
};
